﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System;
using System.Data.Common;
using System.Runtime.InteropServices;

namespace Newsql.Data.RDBMS
{
	/// <summary>
	/// 表示简单的事务处理。
	/// </summary>
	[ComVisible(true)]
	public class SimpleTransaction : IDisposable
	{
		/// <summary>
		/// 初始化 <see cref="SimpleTransaction"/> 的新实例。
		/// </summary>
		/// <param name="transaction">指定 <see cref="System.Data.Common.DbTransaction"/> 的实例。</param>
		public SimpleTransaction(DbTransaction transaction) { this.Transaction = transaction; }

		/// <summary>
		/// 获取 <see cref="System.Data.Common.DbTransaction"/> 的实例。
		/// </summary>
		public DbTransaction Transaction { get; private set; }

		#region IDisposable 成员

		/// <summary>
		/// 释放 <see cref="SimpleTransaction"/> 使用的非托管资源。
		/// </summary>
		public void Dispose() { this.Dispose(true); }

		#endregion

		/// <summary>
		/// 提交数据库事务。
		/// </summary>
		public void Commit()
		{
			this.Transaction.Commit();

			if (this.Transaction.Connection != null) this.Transaction.Connection.Close();
		}

		/// <summary>
		/// 从挂起状态回滚事务。
		/// </summary>
		public void Rollback()
		{
			this.Transaction.Rollback();

			if (this.Transaction.Connection != null) this.Transaction.Connection.Close();
		}

		/// <summary>
		/// 释放 <see cref="SimpleTransaction"/> 使用的非托管资源。
		/// </summary>
		/// <param name="disposing">如果为 true，此方法将释放由此 <see cref="SimpleTransaction"/> 引用的任何托管对象所保留的全部资源。</param>
		public void Dispose(bool disposing)
		{
			if (!disposing) return;
			if (this.Transaction.Connection != null)
			{
				this.Transaction.Connection.Close();
				this.Transaction.Connection.Dispose();
			}

			this.Transaction.Dispose();
		}
	}
}
